#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：turbo 
@File    ：handlers.py
@Author  ：赵加响
@Date    ：2023/4/6 9:55 
@Desc    ：在开发Serializer是如果不继承CustomModelSerializer，则可使用该类进行数据验证错误信息收集
"""
from rest_framework.exceptions import ValidationError

from bases.messages import MSG_30003_VALIDATE_DESC_KEY_NG


class SerializerValidateHandler:
    """
    在Serializer中使用validate方法进行字段验证
    handle_validation负责收集错误字段以及错误信息
    show_validation负责将错误字典返回并由ValidationError抛出
    """

    def __init__(self):
        self._error_dict = dict()

    def handle_validation(self, field, message):
        if field not in self._error_dict:
            temp_list = [message]
            self._error_dict[field] = temp_list

    def has_validation(self):
        return True if len(self._error_dict) > 0 else False

    def show_validation(self):
        return self._error_dict

    def handle_require_fields(self, serializer_fields, validate_attrs, require_fields: tuple):
        """
        validate方法中判断必输项字段是否为空
        调用该方法的前提：model或者serializer中的字段label属性必须指定
        Args:
            serializer_fields: serializer中字段
            validate_attrs: validate方法中数据集
            require_fields: 元组，需要验证的字段

        Returns: 错误数据存入错误字典中

        """
        for field in require_fields:
            label = serializer_fields[field].label
            value = validate_attrs.get(field)

            if value is None or len(value) == 0:
                # todo translation
                error_msg = f"{label}不可为空"
                self.handle_validation(field, error_msg)

    def handle_non_updatable(self, serializer_fields, instance, validated_data, non_updatable_fields: tuple, kwargs):
        """
        update方法中判断部分状态（例如生效）下，不可修改的字段是否发生了变化
        调用该方法的前提：serializer中的字段label属性必须指定
        Args:
            serializer_fields: serializer中字段
            instance: 实例
            validated_data: 数据集
            non_updatable_fields: 元组，需要验证的字段
            kwargs: {'table': '', 'value', 'status': ''}

        Returns: 错误数据存入错误字典中

        """
        for field in non_updatable_fields:
            try:
                label = serializer_fields[field].label
                orig_value = getattr(instance, field)
                new_value = validated_data.get(field)
            except KeyError:
                raise ValidationError(MSG_30003_VALIDATE_DESC_KEY_NG)

            if new_value and orig_value != new_value:
                # todo translation f"当前状态下，{label}不可修改"
                error_msg = "数据在{table}中已经{status}，不可以修改{0}. {0}={1}".format(label, new_value, **kwargs)
                self.handle_validation(field, error_msg)
